25template <
typename T,
int N,
int RC>
28 if (M.cols() != M.rows())
return false;
29 return M.isApprox(M.transpose(), eps);
32template <
typename T,
int N,
int RC>
35 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T, N, N, RC> > eigensolver(M, Eigen::EigenvaluesOnly);
37 if (eigensolver.info() == Eigen::Success)
40 return (eigensolver.eigenvalues().array() >= eps).all();
43 std::cout <<
"eigen decomposition failed" << std::endl;
48template <
typename T,
int N,
int RC>
54#define WOLF_ASSERT_COVARIANCE_MATRIX(x) assert(isCovariance(x, Constants::EPS_SMALL) && "Not a covariance");
56#define WOLF_ASSERT_INFORMATION_MATRIX(x) assert(isCovariance(x, double(0.0)) && "Not an information matrix");
58template <
typename T,
int N,
int RC>
61 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T, N, N, RC> > eigensolver(M);
63 if (eigensolver.info() == Eigen::Success)
67 while ((eigensolver.eigenvalues().array() < eps).any())
72 M = eigensolver.eigenvectors() * eigensolver.eigenvalues().cwiseMax(epsilon).asDiagonal() *
73 eigensolver.eigenvectors().transpose();
74 eigensolver.compute(M);
82 return epsilon != eps;
85 WOLF_ERROR(
"Couldn't compute covariance eigen decomposition");
93 Eigen::MatrixXd info = _info.selfadjointView<Eigen::Upper>();
96 Eigen::LLT<Eigen::MatrixXd> llt_of_info(info);
97 Eigen::MatrixXd R = llt_of_info.matrixU();
103 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(info);
104 Eigen::VectorXd eval = es.eigenvalues().real().cwiseMax(
Constants::EPS);
106 R = eval.cwiseSqrt().asDiagonal() * es.eigenvectors().real().transpose();
#define WOLF_ASSERT_COVARIANCE_MATRIX(x)
Definition: covariance.h:54
#define WOLF_ERROR(...)
Definition: logging.h:445
const double EPS
Definition: wolf.h:74
Definition: capture_base.h:23
bool isCovariance(const Eigen::Matrix< T, N, N, RC > &M, const T &eps=Constants::EPS)
Definition: covariance.h:49
Eigen::MatrixXd computeSqrtUpper(const Eigen::MatrixXd &_info)
Definition: covariance.h:90
bool isSymmetric(const Eigen::Matrix< T, N, N, RC > &M, const T eps=wolf::Constants::EPS)
Definition: covariance.h:26
bool makePosDef(Eigen::Matrix< T, N, N, RC > &M, const T &eps=Constants::EPS)
Definition: covariance.h:59
bool isPositiveSemiDefinite(const Eigen::Matrix< T, N, N, RC > &M, const T &eps=Constants::EPS)
Definition: covariance.h:33